package com.gutsyzhan.bilibili.dao;

import com.gutsyzhan.bilibili.domain.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface VideoDao {
    /**
     * 投稿视频
     */
    Integer addVideo(Video video);

    /**
     * 投稿视频所关联的标签
     */
    Integer batchAddVideoTags(List<VideoTag> videoTagList);

    /**
     * 获取满足指定筛选条件的数据条数
     */
    Integer pageCountVideos(Map<String, Object> params);

    /**
     * 获取满足指定筛选条件的数据信息
     */
    List<Video> pageListVideos(Map<String, Object> params);

    /**
     * 通过videoId查询Video信息
     */
    Video getVideoById(Long videoId);

    /**
     * 通过userId和videoId查询VideoLike信息
     */
    VideoLike getVideoLikeByUserIdAndVideoId(@Param("userId") Long userId, @Param("videoId") Long videoId);

    /**
     * 点赞视频
     */
    void addVideoLike(VideoLike videoLike);

    /**
     * 取消点赞
     */
    void deleteVideoLike(@Param("userId") Long userId, @Param("videoId") Long videoId);

    /**
     * 通过videoId查询该Video所有的点赞数
     */
    Long getVideoLikes(@Param("videoId") Long videoId);

    /**
     * 删除用户收藏
     */
    void deleteVideoCollection(@Param("userId") Long userId, @Param("videoId") Long videoId);

    /**
     * 添加用户收藏
     */
    void addVideoCollection(VideoCollection videoCollection);

    /**
     * 通过videoId查询该Video所有的收藏数
     */
    Long getVideoCollections(@Param("videoId") Long videoId);

    /**
     * 通过userId和videoId查询VideoCollection信息
     */
    VideoCollection getVideoCollectionByUserIdAndVideoId(@Param("userId") Long userId, @Param("videoId") Long videoId);

    /**
     * 通过userId和videoId查询VideoCoin信息
     */
    VideoCoin getVideoCoinByUserIdAndVideoId(@Param("userId") Long userId, @Param("videoId") Long videoId);

    /**
     * 视频投币
     */
    void addVideoCoin(VideoCoin videoCoin);

    /**
     * 再次投币
     */
    void updateVideoCoin(VideoCoin videoCoin);

    /**
     * 通过videoId查询该Video获得到的所有投币数
     */
    Long getVideoCoinsAmount(@Param("videoId") Long videoId);

    /**
     * 视频评论
     */
    void addVideoComment(VideoComment videoComment);

    /**
     * 获取满足指定筛选条件的数据条数
     */
    Integer pageCountVideoComments(Map<String, Object> params);

    /**
     * 获取满足指定筛选条件的数据信息
     */
    List<VideoComment> pageListVideoComments(Map<String, Object> params);

    /**
     * 使用一级评论的id集合去批量查询二级评论
     */
    List<VideoComment> batchGetVideoCommentsByRootIds(List<Long> rootIdList);

    /**
     * 通过videoId查询Video信息
     */
    Video getVideoDetails(Long id);
}
